﻿using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Options;
using star_questionnair.Models;

namespace star_questionnair.Utilities;

public class ApplicationDbContext : DbContext
{
    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : base(options) { }
    
    public DbSet<User> Users { get; set; }
    public DbSet<Response> Responses { get; set; }
    public DbSet<Answer> Answers { get; set; }
    
    public DbSet<Questionnaire> Questionnaires { get; set; }
    public DbSet<Option> Options { get; set; }
    public DbSet<Question> Questions { get; set; }
    
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);
        // 显式声明主键
        modelBuilder.Entity<Answer>()
            .HasKey(a => a.Id);
        
        //response和answer的关系
        modelBuilder.Entity<Response>()
            .HasMany(r => r.Answers)
            .WithOne() // 假设 `Answer` 没有引用回 `Response`
            .HasForeignKey(a => a.ResponseId); // 指定外键
        // 配置一对多关系 response与questionnaire的关系
        modelBuilder.Entity<Response>()
            .HasOne(r => r.Questionnaire) // 导航到主表的引用
            .WithMany(q => q.Responses)   // 主表到从表的集合
            .HasForeignKey(r => r.QuestionnaireId); // 明确外键
        
        modelBuilder.Entity<Option>()
            .Property(o => o.QuestionId)
            .HasColumnName("question_id");
        
        // 配置 Questionnaire 和 Question 之间的关系
        modelBuilder.Entity<Questionnaire>()
            .HasMany(q => q.Questions)    // 一个 Questionnaire 可以有多个 Question
            .WithOne()                    // 假设 Question 不包含返回到 Questionnaire 的引用
            .HasForeignKey(q => q.QuestionnaireId); // 明确指定外键
        
        // 配置 Question 和 Option 之间的一对多关系
        modelBuilder.Entity<Question>()
            .HasMany(q => q.Options) // 一个 Question 可以有多个 Option
            .WithOne() // 一个 Option 属于一个 Question
            .HasForeignKey(o => o.QuestionId); // 外键是 Option 的 QuestionId 字段
    }
}